#ifndef AI_H
#define AI_H

#include <QList>
#include <QQueue>

static const int MAX_DISTANCE=999999999;//定义的一个无穷大的数，表示无穷远的距离
static const int BEVEL_EDGE=7071;//表示斜边距离
static const int STRAIGHT_FLANGE=5000;//表示直边距离

struct ArcNode//边表，记录的是点的临边，同时指向下一临边
{
    int i=-1;//边指向的顶点在顺序表中的位置，-1表示不存在
    ArcNode *nextArc=nullptr;//下一条边，默认指向空指针
    int weight=MAX_DISTANCE;//这条边的权值
};

struct VNode//图节点，记录当前结点信息，同时指向边表
{
    int data=0;//顶点的数据信息
    ArcNode *firstarc=nullptr;//指向单链表，即指向第一条边,默认指向空指针
};
struct info//用来记录
{
    int id=0;//当前点的id
    int move=0;//前驱点的id
    int distance=MAX_DISTANCE;//两点的距离
};
class AI
{
public:
    AI(int** matrix_base, int row, int line);//传入图的信息及图的行列值
    bool work();//计算最优路径
    int** show();//返回最优解
private:
    int row;//行数
    int line;//列数
    int **matrix;//信息矩阵，用于记录每个点(方格)上的情况：0 空白 1 人 2 障碍 3 出口
    int **matrix_copy;//信息矩阵的拷贝，用于比对图解结果是否有变化

    QList<int> list_exit;//存储出口的位置，记录的是id(i,j)=row*i+j
    QList<int> list_person;//存储人员的位置，记录的是id(i,j)=row*i+j

    int position[8];//记录当前点(方格)的id与四周8个位置点(如果存在)的id的数值关系
    int weight[8];//记录当前点(方格)与四周8个位置点(如果存在)的权值
    VNode *graph_bucket;//图的顺序表容器，存储的是点(VNode),容器的大小为网格矩阵的行列值乘积row*line

    int get_info(const int &id) const;//获取节点属性
    bool can_connect(const int &data,const int &id) const;//判断和该id的点间是否有边

    void create();//构建整体矩阵的邻接表
    void create_list(int data, int i, int j);//构建相应点的邻接表

    void found_exit();//获取所有的出口id
    void found_person();//获取所有人员的id
    int get_min_person();//获取离出口最近可移动人员的id
    void get_person(int exit, info &in);//获取指定出口距离最近的人员
};

#endif // AI_H
